% coding: utf-8

\subsection{Limitaciones de la herramienta AntlrWorks}
\indent Se pide en el enunciado: ''El programa no debe terminar si se le pide hacer una valuación errónea. Simplemente debe ignorar el resultado de dicha valuación". Esto lo hacemos correctamente para errores que se detectan en el analizador semántico, la TDS. En particular lo que hacemos es imprimir:\\
\textit{
Sentencia: $<$Sentencia original textual que se intento parsear$>$\\
$<$Mensaje de error$>$\\
}

Por ejemplo:\\
\textit{
Sentencia: 4 a $+$ b;\\
Las unidades no coinciden.\\
}

\indent Luego sigue con la siguiente valuación. Ahora bien, en el caso de que el error sea detectado en el analizador léxico o en el analizador sintáctico, se levanta una excepción propia del código autogenerado por AntlrWorks que imprime un mensaje de error en ingl\'es. Por ejemplo:\\

\textit{
$4-$;\\
line 1:2 no viable alternative at input ';'\\
Sentencia: 4.0;\\
}

\indent Esto es propio del código .java autogenerado por AntlrWorks y no encontramos una manera de customizarlo sin modificar directamente el código autogenerado. Las contras de esto son las siguientes:
\begin{itemize}
\item El parseo de la sentencia continúa y puede devolver un valor, mientras que lo que nos gustaría sería que imprima la sentencia original de entrada
\item Aunque es legible el mensaje de error, está en inglés.
\item Los mensajes de error parecieran ser impresos por un thread distinto del que sigue con el parsing ya que en distintas corridas de la misma entrada salida se puede obtener en distintos ordenes. Ejemplo:

ENTRADA:\\
5b;\\
unidades 4a;\\
$4+4+$;\\
?;\\

SALIDA 1:\\
Sentencia: 5b;\\
Error: 'b' no fue declarado como variable ni como unidad.\\
Sentencia: unidades 4a;\\
line 1:13 extraneous input '4' expecting ID\\
Sentencia: 8.0;\\
line 1:21 no viable alternative at input ';'\\
line 1:23 no viable alternative at character '?'\\

SALIDA 2:\\
Sentencia: 5b;\\
Error: 'b' no fue declarado como variable ni como unidad.\\
line 1:13 extraneous input '4' expecting ID\\
Sentencia: unidades 4a;\\
Sentencia: 8.0;\\
line 1:21 no viable alternative at input ';'\\
line 1:23 no viable alternative at character '?'\\

SALIDA 3:\\
Sentencia: 5b;\\
Error: 'b' no fue declarado como variable ni como unidad.\\
line 1:13 extraneous input '4' expecting ID\\
Sentencia: unidades 4a;\\
line 1:21 no viable alternative at input ';'\\
Sentencia: 8.0;\\
line 1:23 no viable alternative at character '?'\\

Una forma sencilla de corregir esto ser\'ia modificar la excepción que levanta de modo que setee en true una variable global de error léxico y guarde el mensaje en una variable global de texto error léxico. Luego cuando en la TDS verificamos que no haya un error semántico, también verificaríamos que no haya error léxico y de haberlo imprimir la sentencia original seguida del mensaje de error. Lamentablemente esta excepción ni siquiera esta implementada en el código autogenerado, de hecho es parte de las librerías de Antlr.

\end{itemize}



\indent Por último, queremos hacer un comentario respecto a AntlrWorks. Nosotros trabajamos con un versionado. Si uno tiene el archivo .g abierto en AntlrWorks y actualiza el archivo .g por fuera de la herramienta (como puede ser un update del repositorio), AntlrWorks no refresca el archivo y uno sigue editando sobre una versión vieja. Luego al salvar pisa los cambios modificados por fuera. Esto gener\'o que varios bugs corregidos vuelvan a reaparecer.

